package pers.xiaojun.boot.module.system.service.permission;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import pers.xiaojun.boot.common.pojo.PageResult;
import pers.xiaojun.boot.module.system.controller.permission.vo.role.RoleReqVO;
import pers.xiaojun.boot.module.system.controller.permission.vo.role.RoleRespVO;
import pers.xiaojun.boot.module.system.controller.permission.vo.role.RoleSaveVO;
import pers.xiaojun.boot.module.system.dao.entity.permission.RoleDO;

import java.util.Collection;
import java.util.List;

/**
 * 角色服务层
 *
 * @author xiaojun
 * @since 2025-10-10
 */
public interface RoleService extends IService<RoleDO> {


    /**
     * 保存角色
     *
     * @param saveVO 角色信息
     * @return 角色
     */
    RoleDO saveRole(RoleSaveVO saveVO);

    /**
     * 更新角色
     *
     * @param updateVO 角色信息
     * @return 角色
     */
    RoleDO updateRole(RoleSaveVO updateVO);

    /**
     * 根据角色Id删除角色
     *
     * @param roleId 角色Id
     */
    void removeRoleById(Long roleId);

    /**
     * 根据角色Id删除一批角色
     *
     * @param roleIds 角色Id列表
     */
    void removeRoleByIds(List<Long> roleIds);

    /**
     * 根据角色Id获取角色VO
     *
     * @param roleId 角色Id
     * @return 角色VO
     */
    RoleRespVO getRoleVOById(Long roleId);

    /**
     * 条件分页查询角色列表
     *
     * @param roleReqVO 查询数据
     * @return 分页结果
     */
    Page<RoleDO> listRolePage(RoleReqVO roleReqVO);

    /**
     * 根据角色Id列表获取角色信息
     *
     * @param roleIds 角色Id列表
     * @return 角色列表
     */
    List<RoleDO> listRolesByIds(List<Long> roleIds);

    /**
     * 判断角色组中是否有超级管理员标识
     *
     * @param roleIds 角色Id列表
     * @return 是否拥有超级管理员
     */
    boolean hasAnySuperAdmin(List<Long> roleIds);


    /**
     * 判断角色是否超级管理员
     *
     * @param roleId 角色Id
     * @return 是否是超级管理员
     */
    boolean hasSuperAdmin(Long roleId);

    /**
     * 获取超级管理员角色信息
     *
     * @return 超级管理员角色信息
     */
    RoleDO getRoleBySuperAdmin();

    /**
     * 校验多个角色是否存在
     *
     * @param roleIds 角色Id集合
     */
    void validateRolesExists(Collection<Long> roleIds);

    /**
     * 校验角色是否存在
     *
     * @param roleId 角色Id
     */
    RoleDO validateRoleExists(Long roleId);

}
